Writing an Assembly Program Without Symbols Although Assembly language is low level, it still abstracts quite a lot. You can remove some of this abstraction by not using symbols. This brings you slightly closer to human readable machine code. Writing code without symbols is quite easy on ARM. All instructions are four bytes long, so you basically count the lines, multiply it by four, then add it to the entry point for the address. Here is an example for printing "Hello, World!": @ A "Hello World" program without symbols for Linux ARM. @ To create an executable, run: @ as -o hello.o hello.s @ ld -e 65620 -o hello hello.o .sect .text mov r7, $4 @ Setup service call 4 (write) mov r0, #1 @ Parameter 1 - file descripter 1 = STDOUT ldr r1, [pc, #16] @ Paremeter 2 - address of string address = PC @ (current byte from entry + 4, so 65636) + 16 mov r2, #14 @ Parameter 3 - length of string swi #0 @ Ask Linux kernel to write to STDOUT mov r7, #1 @ Setup service call 1 (exit) mov r0, #0 @ Parameter 1 - 0 = normal exit swi #0 @ Ask Linux kernel to terminate this program .long 65656 @ String address = 65620 + 36 (bytes from entry) .ascii "Hello, World!" .byte 10 @ New-line character On 80386, it's significantly harder. Each instruction is 1-5 bytes long. The exact length depends on the instruction and its arguments, if any. As a result, you must calculate the length of each instruction one by one be- fore you can add them. .